package com.example.administrator.myapplication;

import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.SeekBar;
import android.widget.TextView;


public class MainActivity extends AppCompatActivity {
    private TextView tv;
    private Handler handler;
    private SeekBar sb;
    private boolean isPause=false;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView)findViewById(R.id.tv);
        sb = (SeekBar)findViewById(R.id.sb);
        handler=new Handler() {
            @Override
            public void handleMessage(Message msg) {
                int i = msg.getData().getInt("pro");
                tv.setText("test:"+i);
                sb.setProgress(i);
            }
        };
    }

    public void start(View view) {
        new Thread(){
            @Override
            public void run() {
                synchronized (handler) {//这把锁在主线程和主线程中都是共用的，其中的对象是二者皆可见的唯一对象，否则wait()调用处无效。此处选择Handler作为共用对象更为合适。
                    for (int i = 0; i < 101; i++) {
                        if (isPause) {
                            try {
                                handler.wait();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                            // this.wait();this是匿名内部类（new Thread()）的一个实例。
                            // 另外，wait()和notify()配套使用，且二者被调用时要求必须处于一个同步代码块的内部（Synchronized）,还要求其调用对象必须是同步代码块中的那个同步锁
                         }
                        try {
                            Thread.sleep(20);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        Message msg = new Message();
                        Bundle bundle = new Bundle();
                        bundle.putInt("pro", i);
                        msg.setData(bundle);
                        handler.sendMessage(msg);
                    }
                }
            }
        }.start();
    }

    public void pause(View view) {
        isPause=true;
    }

/*    public synchronized void resume(View view) {
        isPause=false;
        notify();//代表synchronized锁对象自身
    }*/
    public synchronized void resume(View view) {
        synchronized (handler){
            isPause=false;
            handler.notify();//唤醒，让其重新进入线程调用机
        }
    }
}

